package interface_graphique;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.ListIterator;
import java.util.Scanner;

import projet_ihm.Action;
import projet_ihm.CompareAjout;
import projet_ihm.CompareDate;
import projet_ihm.P_Avec_Date;
import projet_ihm.Produit;
import projet_ihm.Recette;
import projet_ihm.compareQuantite;
import projet_ihm.compareQuantiteDec;
import projet_ihm.compareTaille;
import projet_ihm.compareTailleDec;

public class Frigo {

	

	HashMap<E_Type, ArrayList> inventaire;
	private ArrayList recette; /* une liste de recette de recette */
	private ArrayList<Action> undo; /* Liste d'action pour undo et redo */
	private ArrayList<Action> redo;

	public Frigo() {
		this.inventaire = new HashMap<E_Type, ArrayList>();
		this.recette = new ArrayList();
		undo = new ArrayList<Action>();
		redo = new ArrayList<Action>();
	}

	public void AjoutRectte(Recette r) {
		recette.add(r);
	}

	public void SuppRecette(Recette r) {
		ListIterator it = recette.listIterator();

		while (it.hasNext()) {

			Recette element = (Recette) it.next();
			if (r.equals(element)) {
				recette.remove(element);
				System.out.println("supp reussi");
			}

		}
	}

	public HashMap<E_Type, ArrayList> getInventaire() {
		return inventaire;
	}

	public void setInventaire(HashMap<E_Type, ArrayList> inventaire) {
		this.inventaire = inventaire;
	}

	public ArrayList getRecette() {
		return recette;
	}

	public void setRecette(ArrayList recette) {
		this.recette = recette;
	}

	public void affiche_Selon_datExp() {
		int j = 1;
		int i = 1;
		System.out
				.println("\n @@@@@@@@@@@@@@  du frigo par date peremtion @@@@@@@@@@@@@@@@@@\n\n");
		for (E_Type mapKey : this.inventaire.keySet()) {
			System.out.println("\n#" + i + " " + mapKey + " il y a : ");
			ArrayList listTmp = new ArrayList();
			listTmp = inventaire.get(mapKey);
			ListIterator it3 = listTmp.listIterator();

			Collections.sort(inventaire.get(mapKey), new CompareDate());

			while (it3.hasNext()) {

				Produit element = (Produit) it3.next();
				System.out.println("			---> #" + j + " " + element.toString()
						+ "\n");
				j++;
			}

			j = 1;
			i++;

		}
	}

	
	public void affiche_Selon_datAjout() {
		int j = 1;
		int i = 1;
		System.out
				.println("\n @@@@@@@@@@@@@@  du frigo par date Ajout @@@@@@@@@@@@@@@@@@\n\n");
		for (E_Type mapKey : this.inventaire.keySet()) {
			System.out.println("\n#" + i + " " + mapKey + " il y a : ");
			ArrayList listTmp = new ArrayList();
			listTmp = inventaire.get(mapKey);
			ListIterator it3 = listTmp.listIterator();

			Collections.sort(inventaire.get(mapKey), new CompareAjout());

			while (it3.hasNext()) {

				Produit element = (Produit) it3.next();
				System.out.println("			---> #" + j + " " + element.toString()
						+ "\n");
				j++;
			}

			j = 1;
			i++;

		}
	}
	
	
	public void check(){
		
		
		int j = 1;
		int i = 1;
		int ok=1;
		int k =0;
		Date d=new Date();
		
		Scanner sc1 = new Scanner(System.in);
	
		System.out
				.println("\n @@@@@@@@@@@@@@ check  @@@@@@@@@@@@@@@@@@\n\n");
		for (E_Type mapKey : this.inventaire.keySet()) {
			System.out.println("\n#" + i + " " + mapKey + " il y a : ");
			ArrayList listTmp = new ArrayList();
			listTmp = inventaire.get(mapKey);
			ListIterator it3 = listTmp.listIterator();
 
			
			while (it3.hasNext()) {

				P_Avec_Date element = (P_Avec_Date) it3.next();
				Date date = element.getDate_peremption();
				if(date.compareTo(d)<0){
					System.out.println("			---> #" + j + " " + element.toString()
							+ "\n");
				}
				
				j++;
			}
			
			
			

			j = 1;
			i++;

		}
		j=0;
		 
	 
			
			System.out.println("Voulez supprimmer les produit perimer ? (oui ou non )");
			String taper = sc1.nextLine();
			if(taper.contentEquals("oui")){
				for (E_Type mapKey : this.inventaire.keySet()) {
					 
					ArrayList listTmp = new ArrayList();
					listTmp = inventaire.get(mapKey);
					ListIterator it3 = listTmp.listIterator();
		 
					
					while (it3.hasNext()) {

						P_Avec_Date element = (P_Avec_Date) it3.next();
						Date date = element.getDate_peremption();
						if(date.compareTo(d)<0){
						it3.remove();
							
							
						}
						
						 j++;
					}
					
					j=0;
					

					 

				}
				
			}
		
		
		
		  
			 
			
		
	}
	
	
	public void affiche_Selon_nb() {

		int j = 1;
		int i = 1;
		System.out
				.println("\n @@@@@@@@@@@@@@ Contenu du frigo par quantite croissant @@@@@@@@@@@@@@@@@@\n\n");
		for (E_Type mapKey : this.inventaire.keySet()) {
			System.out.println("\n#" + i + " " + mapKey + " il y a : ");

			ArrayList listTmp = new ArrayList();
			listTmp = inventaire.get(mapKey);
			ListIterator it3 = listTmp.listIterator();

			Collections.sort(inventaire.get(mapKey), new compareQuantite());

			while (it3.hasNext()) {

				Produit element = (Produit) it3.next();
				System.out.println("			---> #" + j + " " + element.toString()
						+ "\n");
				j++;
			}

			j = 1;
			i++;

		}

	}

	public void affiche_Selon_nbDec() {

		int j = 1;
		int i = 1;
		System.out
				.println("\n @@@@@@@@@@@@@@ Contenu du frigo par quantite decroissant @@@@@@@@@@@@@@@@@@\n\n");
		for (E_Type mapKey : this.inventaire.keySet()) {
			System.out.println("\n#" + i + " " + mapKey + " il y a : ");

			ArrayList listTmp = new ArrayList();
			listTmp = inventaire.get(mapKey);
			ListIterator it3 = listTmp.listIterator();

			Collections.sort(inventaire.get(mapKey), new compareQuantiteDec());
			while (it3.hasNext()) {

				Produit element = (Produit) it3.next();
				System.out.println("			---> #" + j + " " + element.toString()
						+ "\n");
				j++;
			}

			j = 1;
			i++;

		}

	}

	public void affiche_Selon_taille() {

		int j = 1;
		int i = 1;
		System.out
				.println("\n @@@@@@@@@@@@@@ Contenu du frigo par taille croissant @@@@@@@@@@@@@@@@@@\n\n");
		for (E_Type mapKey : this.inventaire.keySet()) {
			System.out.println("\n#" + i + " " + mapKey + " il y a : ");

			ArrayList listTmp = new ArrayList();
			listTmp = inventaire.get(mapKey);
			ListIterator it3 = listTmp.listIterator();

			Collections.sort(inventaire.get(mapKey), new compareTaille());
			while (it3.hasNext()) {

				Produit element = (Produit) it3.next();
				System.out.println("			---> #" + j + " " + element.toString()
						+ "\n");
				j++;
			}

			j = 1;
			i++;

		}

	}

	public void affiche_Selon_tailleDec() {

		int j = 1;
		int i = 1;
		System.out
				.println("\n @@@@@@@@@@@@@@ Contenu du frigo par taille decroissant @@@@@@@@@@@@@@@@@@\n\n");
		for (E_Type mapKey : this.inventaire.keySet()) {
			System.out.println("\n#" + i + " " + mapKey + " il y a : ");

			ArrayList listTmp = new ArrayList();
			listTmp = inventaire.get(mapKey);
			ListIterator it3 = listTmp.listIterator();

			Collections.sort(inventaire.get(mapKey), new compareTailleDec());
			while (it3.hasNext()) {

				Produit element = (Produit) it3.next();
				System.out.println("			---> #" + j + " " + element.toString()
						+ "\n");
				j++;
			}

			j = 1;
			i++;

		}
	}

	public void affContenu() {
		int j = 1;
		int i = 1;
		System.out
				.println("\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Contenu du frigo @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
		System.out
				.println("------------------------------------------------------------------------------------------------\n\n");
		for (E_Type mapKey : this.inventaire.keySet()) {
			if (inventaire.get(mapKey).isEmpty())
				continue;
			System.out.println("\n#" + i + " " + mapKey + " il y a  : ");

			ArrayList listTmp = new ArrayList();
			listTmp = inventaire.get(mapKey);
			ListIterator it3 = listTmp.listIterator();

			while (it3.hasNext()) {

				Produit element = (Produit) it3.next();
				System.out.println("			---> #" + j + " " + element.toString()
						+ "\n");
				j++;
			}

			j = 1;
			i++;

		}
		System.out
				.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");

	}


	public void undo() {
		int sizeList = undo.size();
		if (sizeList > 0) { /* Si la liste est vide, plus rien n'as faire */
			Action action = new Action(undo.get(sizeList - 1));
			Produit p = action.getListeProduit().get(0);

			switch (action.getTypeAction()) {
			case Ajouter:
				this.inventaire.get(p.getType()).remove(p);
				break;
			case Supprimer:
				this.inventaire.get(p.getType()).add(p);
				break;
			case AugmenterQuantite: // a faire
				break;
			case DiminuerQuantite: // a faire
				break;

			}
			undo.remove(sizeList - 1); // on "depile"

		}
	}

	public void redo() {
		int sizeList = redo.size();
		if (sizeList > 0) { /* Si la liste est vide, plus rien n'as faire */
			Action action = new Action(redo.get(sizeList - 1));
			Produit p = action.getListeProduit().get(0);

			switch (action.getTypeAction()) {
			case Ajouter:
				this.inventaire.get(p.getType()).add(p);
				break;
			case Supprimer:
				this.inventaire.get(p.getType()).remove(p);
				break;
			case AugmenterQuantite: // a faire
				break;
			case DiminuerQuantite: // a faire
				break;
			}
			redo.remove(sizeList - 1); // on "depile"
		}

	}

	public void afficheChoix() {
		System.out.println(" Available actions :");
		System.out
				.println(" 'a'  - add                      's'   - display content");
		System.out
				.println(" 'r'  - remove                   'sda' - sorted by date added");
		System.out
				.println(" 're' - remove expired           'sed' - sorted by expiration date");
		System.out
				.println(" 'i'  - increase quantity        'sqi' - sorted by increasing quantity");
		System.out
				.println(" 'd'  - decrease quantity        'sqd' - sorted by decreasing quantity");
		System.out.println(" 'ck' - check expiration");
	}

	
	
}
